package 多线程.CompletableFuture异步编排;

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 allOf：必须等待所有的任务都执行完毕，才能继续执行，否则阻塞；
 anyOf：只要其中一个任务执行完毕，则继续执行。
 */
public class ThreadTest11 {
    // 自定义线程池
    public static final ExecutorService executorService = Executors.newFixedThreadPool(10);

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        CompletableFuture<String> futureA = CompletableFuture.supplyAsync(() -> {
            System.out.println("任务A开始执行...");
            System.out.println("任务A执行完毕...");
            return "A";
        }, executorService);

        CompletableFuture<String> futureB = CompletableFuture.supplyAsync(() -> {
            System.out.println("任务B开始执行...");
            System.out.println("任务B执行完毕...");
            return "B";
        }, executorService);
        CompletableFuture<String> futureC = CompletableFuture.supplyAsync(() -> {
            System.out.println("任务C开始执行...");
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("任务C执行完毕...");
            return "C";
        }, executorService);

        // 有一个任务执行完毕 则继续往下执行
        CompletableFuture<Object> anyOf = CompletableFuture.anyOf(futureA, futureB, futureC);
        anyOf.get();
        System.out.println("执行完毕任务的返回值:" + anyOf.get());
    }



//    output：
//    任务A开始执行...
//    任务A执行完毕...
//    任务B开始执行...
//    任务B执行完毕...
//    执行完毕任务的返回值:A
//    任务C开始执行...
//    任务C执行完毕...

}
